import axios from "axios";
import ReturnResult from '../utils/ReturnResult';

/**
 * 图书相关服务
 */
class BookService {

    /**
     * 获取图书列表
     * @param {number} pageNo 页码
     * @param {number} pageSize 页容量
     * @param {number} minPrice 最低价
     * @param {number} maxPrice 最高价
     * @returns {Promise<Book[]>} 图书列表
     */
    async getBookList(pageNo, pageSize, minPrice, maxPrice) {
        try {
            const resp = await axios.get('/book', { params: { pageNo, pageSize, minPrice, maxPrice } });
            return resp.data;
        } catch (err) {
            console.error(err);
        }
        return { totalCount: 0, bookList: [] };
    }

    /**
     * 添加图书
     * @param {Book} book 图书数据 
     * @returns {Promise<ReturnResult>} 添加结果
     */
    async addBook(book) {
        // 校验图书数据
        const map = {
            image: '请选择图书封面',
            name: '书名不能为空',
            author: '作者不能为空',
            price: '价格不能为空',
            stock: '库存不能为空'
        };
        for (const key in map) {
            if (!book[key]) {
                return ReturnResult.fail(map[key]);
            }
        }
        // 发起请求
        const data = new FormData();
        for (const key in book) {
            data.append(key, book[key]);
        }
        try {
            const resp = await axios.post('/book', data, { headers: { 'Content-Type': 'multipart/form-data' } });
            return ReturnResult.from(resp.data);
        } catch (err) {
            console.error(err);
        }
        return ReturnResult.fail('添加失败');
    }

    /**
     * 获取图书数据
     * @param {string|number} id 图书id
     * @returns {Promise<Book>} 图书数据
     */
    async getBookById(id) {
        try {
            const resp = await axios.get('/book/' + id);
            return resp.data;
        } catch (err) {
            console.error(err);
        }
        return null;
    }

    /**
     * 修改图书
     * @param {Book} book 图书数据
     * @returns {Promise<ReturnResult>} 修改结果
     */
    async updateBook(book) {
        // 校验数据
        const map = {
            name: '书名不能为空',
            author: '作者不能为空',
            price: '价格不能为空',
            stock: '库存不能为空'
        };
        for (const key in map) {
            if (!book[key]) {
                return ReturnResult.fail(map[key]);
            }
        }

        // 发起请求
        const data = new FormData();
        for (const key in book) {
            data.append(key, book[key]);
        }
        try {
            const resp = await axios.put('/book', data, { headers: { 'Content-Type': 'multipart/form-data' } });
            return ReturnResult.from(resp.data);
        } catch (err) {
            console.error(err);
        }
        return ReturnResult.fail('修改失败');
    }

    /**
     * 删除图书
     * @param {string|number} id 图书id
     * @returns {Promise<ReturnResult>} 删除结果
     */
    async deleteBook(id) {
        try {
            const resp = await axios.delete('/book/' + id);
            return ReturnResult.from(resp.data);
        } catch (err) {
            console.log(err);
        }
        return ReturnResult.fail('删除失败');
    }
}

export default new BookService();